package com.zbkj.service.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.zbkj.common.model.traceability.TraceableItems;
import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.response.traceability.TraceableItemWithBatchResponse;

/**
 * 可追溯项Service接口
 * +----------------------------------------------------------------------
 * | CRMEB [ CRMEB赋能开发者，助力企业发展 ]
 * +----------------------------------------------------------------------
 * | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
 * +----------------------------------------------------------------------
 * | Licensed CRMEB并不是自由软件，未经许可不能去掉CRMEB相关版权
 * +----------------------------------------------------------------------
 * | Author: xiaolic
 * +----------------------------------------------------------------------
 */
public interface TraceableItemsService extends IService<TraceableItems> {

    /**
     * 为批次生成可追溯项记录
     * @param batchId 批次ID
     * @return 生成结果
     */
    Boolean generateForBatch(Long batchId);

    /**
     * 分页查询可追溯项列表
     * @param batchId 批次ID
     * @param request 分页请求参数
     * @return 分页结果
     */
    PageInfo<TraceableItems> getPageList(Long batchId, PageParamRequest request);

    /**
     * 获取可追溯项详情
     * @param id 可追溯项ID
     * @return 可追溯项详情
     */
    TraceableItems getDetail(Long id);

    /**
     * 根据批次ID和序列号获取可追溯项详情
     * @param batchId 批次ID
     * @param serialNumber 序列号
     * @return 可追溯项详情
     */
    TraceableItems getByBatchAndSerial(Long batchId, Long serialNumber);
    
    /**
     * 根据唯一溯源ID获取可追溯项
     * @param traceId 唯一溯源ID
     * @return 可追溯项详情
     */
    TraceableItems getByTraceId(Long traceId);

    /**
     * 增加访问计数
     * @param id 可追溯项ID
     * @return 增加结果
     */
    Boolean incrementScanCount(Long id);
    
    /**
     * 增加唯一溯源ID的访问计数
     * @param traceId 唯一溯源ID
     * @return 增加结果
     */
    Boolean incrementScanCountByTraceId(Long traceId);

    /**
     * 生成二维码
     * @param traceableItem 可追溯项
     * @return 二维码URL
     */
    String generateQrCode(TraceableItems traceableItem);
    
    /**
     * 根据产品ID分页查询所有批次下的可追溯项
     * @param productId 产品ID
     * @param request 分页参数
     * @return 带有批次信息的可追溯项列表
     */
    PageInfo<TraceableItemWithBatchResponse> getPageListByProductId(Integer productId, PageParamRequest request);
}
